# coding=utf-8
# 全世界最帅的帅哥
class BaseSerializer:
    # 对象序列化基类
    def __init__(self, data):
        self.data = data

    def to_dict(self):
        # 个性化的序列化，子类重写
        return {}


class BaseListSerializer:
    # 列表对象序列化基类
    def __init__(self, data, *args, **kwargs):
        self.data_list = data
        self.args = args
        self.kwargs = kwargs

    def select_type_serializer(self):
        if not self.data_list:
            return None
        # 解析列表
        if isinstance(self.data_list, list):
            if len(self.data_list) == 0:
                return None
            else:
                self.data_list = [dict(zip(result.keys(), result)) for result in self.data_list]

        else:
            # 传入的参数不是列表
            return {"msg": "传入的参数对象类型有误"}

    def to_dict(self):
        # 个性化的序列化，子类重写
        return {}


class BasePaginateSerializer:
    # 分页数据序列化基类
    def __init__(self, paginate, *args, **kwargs):
        self.pg = paginate
        self.tuple_data = args
        self.dict_data = kwargs
        if not self.pg:
            return paginate

        self.has_next = self.pg.has_next  # 是否有下一页
        self.has_prev = self.pg.has_prev  # 是否有上一页
        self.next_num = self.pg.next_num  # 下一页的页码
        self.page = self.pg.page  # 当前页的页码
        self.pages = self.pg.pages  # 匹配的元素的总页数
        self.total = self.pg.total  # 匹配的元素总数
        self.page_size = self.pg.per_page  # 一页最多显示多少数据

    def get_object(self, obj):
        # 对象的内容，序列化个性操作，留给子类重写
        return {}

    def paginateInfo(self):
        """分页信息，是否有上下页，页数，总页数等"""
        return {
            'has_next': self.has_next,
            'has_prev': self.has_prev,
            'next_num': self.next_num,
            'page': self.page,
            'pages': self.pages,
            'total': self.total,
            'page_size': self.page_size
        }

    def to_dict(self):
        """序列化分页数据"""
        pg_info = self.paginateInfo()
        paginate_data = []
        for obj in self.pg.items:
            paginate_data.append(self.get_object(obj))
        return {
            'paginateInfo': pg_info,  # 分页对象本身
            'totalElements': pg_info['total'],  # 总记录数
            'content': paginate_data  # 当前页所需要展示的数据列表
        }